package com.wang.weblog.web.service.impl;

import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.google.common.collect.Lists;

import com.wang.weblog.common.domain.dos.*;

import com.wang.weblog.common.domain.mapper.*;
import com.wang.weblog.common.enums.ResponseCodeEnum;
import com.wang.weblog.common.exception.BizException;
import com.wang.weblog.common.utils.PageResponse;
import com.wang.weblog.common.utils.Response;
import com.wang.weblog.web.convert.ArticleConvert;
import com.wang.weblog.web.markdown.MarkdownHelper;
import com.wang.weblog.web.model.vo.archive.FindArchiveArticlePageListReqVO;
import com.wang.weblog.web.model.vo.archive.FindArchiveArticlePageListRspVO;
import com.wang.weblog.web.model.vo.archive.FindArchiveArticleRspVO;
import com.wang.weblog.web.model.vo.article.FindArticleDetailReqVO;

import com.wang.weblog.web.model.vo.article.FindArticleDetailRspVO;
import com.wang.weblog.web.model.vo.article.FindPreNextArticleRspVO;
import com.wang.weblog.web.model.vo.tag.FindTagListRspVO;
import com.wang.weblog.web.service.ArchiveService;
import lombok.extern.slf4j.Slf4j;

import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.time.YearMonth;
import java.util.*;
import java.util.stream.Collectors;

@Service
@Slf4j
public class ArchiveServiceImpl implements ArchiveService {

    @Resource
    private ArticleMapper articleMapper;


    @Override
    public Response findArchivePageList(FindArchiveArticlePageListReqVO findArchiveArticlePageListReqVO) {
        Long current = findArchiveArticlePageListReqVO.getCurrent();
        Long size = findArchiveArticlePageListReqVO.getSize();

        // 分页查询
        Page<ArticleDO> page = articleMapper.selectPageList(current, size, null, null, null,null);
        List<ArticleDO> articleDOS = page.getRecords();


        List<FindArchiveArticlePageListRspVO> vos = Lists.newArrayList();
        if (CollectionUtils.isNotEmpty(articleDOS)) {
            // DO 转 VO
            List<FindArchiveArticleRspVO> rspVOS = articleDOS.stream().map(ArticleConvert.INSTANCE::convertDO2ArchiveArticleVO).collect(Collectors.toList());

            // 按创建的月份进行分组
            Map<YearMonth, List<FindArchiveArticleRspVO>> map
                    = rspVOS.stream().collect(Collectors.groupingBy(FindArchiveArticleRspVO::getCreateMonth));

            // 使用 TreeMap 按月份倒序排列
            Map<YearMonth, List<FindArchiveArticleRspVO>> sortedMap = new TreeMap<>(Collections.reverseOrder());
            sortedMap.putAll(map);
            // 遍历排序后的 Map，将其转换为归档 VO
            sortedMap.forEach((k, v) ->
                    vos.add(FindArchiveArticlePageListRspVO.builder()
                    .month(k)
                    .articles(v)
                    .build()));
        }

        return PageResponse.success(page,vos);
    }


}
